# coding=utf-8

# 导入OpenCV库
import cv2
# 导入NumPy数值计算库
import numpy as np
# 导入Matplotlib绘图库的pyplot模块用于显示
from matplotlib import pyplot as plt

####################################  
# BGR转RGB函数（用于OpenCV与Matplotlib的颜色空间适配）
def bgr2rgb(src):
    # 创建副本避免修改原始图像
    img = src.copy()
    # 交换红色和蓝色通道（OpenCV BGR -> Matplotlib RGB）
    img[:,:,0] = src[:,:,2]  # 新B通道为原始R通道
    img[:,:,2] = src[:,:,0]  # 新R通道为原始B通道
    return img
######################################  

# 读取原始图像
img = cv2.imread("smooth.jpg")

# 创建掩膜（定义滤波器核）
k = 9  # 滤波器核尺寸
# 创建均值滤波器核（全1矩阵归一化）
kernel = np.ones((k,k), np.float32)/k**2  # 核尺寸为k×k，每个元素值为1/k²
#print kernel

# 均值滤波，-1表示输出图像深度与输入相同
img_average = cv2.filter2D(img, -1, kernel)

# 使用blur()函数进行均值滤波
img_blur = cv2.blur(img, (k,k))

# 高斯平滑，第三个参数是标准差σ
img_gaussian = cv2.GaussianBlur(img, (k,k), 3)

# 中值滤波，核尺寸为k
img_median = cv2.medianBlur(img, k)

# 拉普拉斯滤波（边缘检测，增强高频成分），-1表示输出图像深度与输入相同
img_laplace = cv2.Laplacian(img, -1)

# 创建Matplotlib画布（2行3列布局，共6个子图）
plt.subplot(231), plt.imshow(bgr2rgb(img), "gray"), plt.title("Original")
plt.xticks([]), plt.yticks([])  # 隐藏坐标轴刻度
# 显示均值滤波结果
plt.subplot(232), plt.imshow(bgr2rgb(img_average), "gray"), plt.title("average_filtering")
plt.xticks([]), plt.yticks([]) # 隐藏坐标轴刻度
# 显示高斯滤波结果
plt.subplot(233), plt.imshow(bgr2rgb(img_gaussian), "gray"), plt.title("gaussian_filtering")
plt.xticks([]), plt.yticks([]) # 隐藏坐标轴刻度

# 显示中值滤波结果
plt.subplot(235), plt.imshow(bgr2rgb(img_median), "gray"), plt.title("median_filtering")
plt.xticks([]), plt.yticks([]) # 隐藏坐标轴刻度
# 显示拉普拉斯滤波结果
plt.subplot(236), plt.imshow(bgr2rgb(img_laplace), "gray"), plt.title("laplace_filtering")
plt.xticks([]), plt.yticks([]) # 隐藏坐标轴刻度

# 显示所有子图
plt.show()